package top.shiyiri.dao;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import top.shiyiri.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author Aunean
 * @date 2022/1/28 17:54
 */
public class BaseDao {

    //使用dbUtils操作数据库
    private QueryRunner query = new QueryRunner();

    /**
     * update()：用来执行 Insert/Update/Delete 操作
     * @return -1，执行失败；其他表示影响的行数
     */
    public int update(String sql, Object ... args) {
        System.out.println("BaseDao 程序在【"+Thread.currentThread().getName()+"】中");

        Connection conn = JDBCUtils.getConnection();
        try {
            return query.update(conn, sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * QueryForOne()：查询返回一个JavaBean对象
     * @param type 返回的对象类型
     * @param sql  执行的sql语句
     * @param args  sql对应的参数值
     * @param <T>  返回值的泛型
     * @return  查询到的结果
     */
    public <T> T QueryForOne(Class<T> type, String sql, Object ... args) {
        Connection conn = JDBCUtils.getConnection();
        BeanHandler<T> handler = new BeanHandler<>(type);
        try {
            return query.query(conn, sql, handler, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * queryForList()：查询返回一个JavaBean集合对象
     * @param type 返回的对象类型
     * @param sql  执行的sql语句
     * @param args  sql对应的参数值
     * @param <T>  返回值的泛型
     * @return  查询到的集合
     */
    public <T> List<T> queryForList(Class<T> type, String sql, Object ... args) {
        Connection conn = JDBCUtils.getConnection();
        BeanListHandler<T> handler = new BeanListHandler<>(type);
        try {
            return this.query.query(conn, sql, handler, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * queryForSingleValue()：查询一个数据
     * @param sql  执行的sql语句
     * @param args  sql对应的参数值
     * @return  一个数据
     */
    public Object queryForSingleValue(String sql, Object ... args) {
        Connection conn = JDBCUtils.getConnection();
        ScalarHandler handler = new ScalarHandler();
        try {
            return this.query.query(conn, sql, handler, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
